package org.itstack.demo.design;

/**
 * @Author: gs
 * @Date: 2024/9/4 21:09
 * @Version: v1.0.0
 * @Description: TODO
 **/

/*
* 单例模式的核心思想是确保一个类只有一个实例，并提供一个全局访问点。
* 这种模式的核心在于控制类的实例化过程，保证在任何时间点，一个类只有一个实例存在，并且这个实例可以被系统的所有其他部分通过一个公共的访问点访问。
*
* 关键点：
*   唯一实例：单例模式要求一个类在任何情况下只能创建一个实例。这意味着无论多少次尝试创建对象，或者通过什么方式创建对象，最终都应当返回同一个实例。
*   全局访问点：单例模式提供了一个统一的接口或方法，允许程序的任何其他部分无需关心实例的创建细节，就能够访问到这个唯一的实例。
*   自我实例化：单例类负责自己的实例化过程。它通常会提供一个静态方法，如 getInstance()，用于返回类的唯一实例。如果实例不存在，该方法会创建一个实例，并在后续的调用中返回这个实例。
*   私有构造函数：为了避免外部通过 new 关键字或其他方式创建新的实例，单例类的构造函数通常被声明为 private，这样就只能由类本身来实例化。
*   线程安全：在多线程环境中，单例模式还需要确保线程安全，即在多个线程同时访问时，也能确保只创建一个实例。这通常通过同步机制（如 synchronized 关键字）或高级别的并发控制来实现。
*   序列化安全：单例模式还需要考虑序列化和反序列化的安全问题。为了确保反序列化不会创建新的实例，可以通过实现 Serializable 接口并定义 readResolve() 方法来保证实例的唯一性。
*
* 懒汉模式：懒汉式一开始不会实例化，什么时候用就什么时候new，才进行实例化。
* 线程不安全
* */
public class Singleton_01 {

    private static Singleton_01 instance;

    private Singleton_01(){

    }

    public static Singleton_01 getInstance(){
        if (null != instance){
            return instance;
        }
        return new Singleton_01();
    }
}
